package com.katze.boot.system.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.katze.boot.common.domain.ActiveUser;
import com.katze.boot.system.domain.DeptUsers;
import com.katze.boot.system.domain.User;
import com.katze.common.Pagination;

import java.util.Collection;
import java.util.List;


public interface UserService extends IService<User> {

    /**
     * 判断用户是否存在
     * @param username 用户名
     * @param password 密码
     */
    boolean exists(String username, String... password);

    /**
     * 通过用户名查找用户(查缓存后查数据库)
     *
     * @param username username
     * @return user
     */
    User findCacheByName(String username);

    /**
     * 通过用户名查找用户详细信息(查数据库)
     * 注：有密码参数时，则说明是登录接口返回的权限信息额外携带名称和图标信息；反正没有密码参数时，只需要权限信息
     * @param username 用户名
     * @param password 用户登录密码
     * @return user
     */
    User findDetailByName(String username, String... password);

    /**
     * 通过用户名查找用户基础信息(查数据库)
     * @param username username
     * @return user
     */
    List<ActiveUser> findUserByUsernames(Collection<String> username);

    /**
     * 查询用户详情，包括基本信息，用户角色，用户部门
     *
     * @param user user
     * @param pagination queryRequest
     * @return IPage
     */
    IPage<User> findUsers(User user, Pagination pagination);

    /**
     * 更新用户登录时间
     *
     * @param user 用户信息
     */
    void updateLoginTime(User user);

    /**
     * 新增用户
     *
     * @param user user
     */
    void createUser(User user);

    /**
     * 修改用户
     *
     * @param user user
     */
    void updateUser(User user);

    /**
     * 删除用户
     *
     * @param usernames 用户 id数组
     */
    void deleteUsers(String... usernames);

    /**
     * 更新个人信息
     *
     * @param user 个人信息
     */
    void updateProfile(User user);

    /**
     * 更新用户头像
     *  @param username 用户名
     * @param avatar   用户头像*/
    void updateAvatar(String username, String avatar);

    /**
     * 更新用户密码
     *  @param username 用户名
     * @param password 新密码
     */
    void updatePassword(String username, String password);

    /**
     * 注册用户
     *  @param username 用户名
     * @param password 密码
     */
    void regist(String username, String password);

    /**
     * 重置密码
     *
     * @param usernames 用户集合
     */
    void resetPassword(String[] usernames);

    String findSubordinates(Long deptId) throws Exception;

    List<DeptUsers> findSubordinatesMap();
}
